1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.google.common.collect;
18
19 import static com.google.common.base.Preconditions.checkArgument;
20 import static com.google.common.base.Preconditions.checkElementIndex;
21 import static com.google.common.base.Preconditions.checkNotNull;
22 import static com.google.common.base.Preconditions.checkPositionIndex;
23 import static com.google.common.base.Preconditions.checkPositionIndexes;
24 import static com.google.common.base.Preconditions.checkState;
25 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
26 import static com.google.common.collect.CollectPreconditions.checkRemove;
27
28 import com.google.common.annotations.Beta;
29 import com.google.common.annotations.GwtCompatible;
30 import com.google.common.annotations.GwtIncompatible;
31 import com.google.common.annotations.VisibleForTesting;
32 import com.google.common.base.Function;
33 import com.google.common.base.Objects;
34 import com.google.common.math.IntMath;
35 import com.google.common.primitives.Ints;
36
37 import java.io.Serializable;
38 import java.math.RoundingMode;
39 import java.util.AbstractList;
40 import java.util.AbstractSequentialList;
41 import java.util.ArrayList;
42 import java.util.Arrays;
43 import java.util.Collection;
44 import java.util.Collections;
45 import java.util.Iterator;
46 import java.util.LinkedList;
47 import java.util.List;
48 import java.util.ListIterator;
49 import java.util.NoSuchElementException;
50 import java.util.RandomAccess;
51 import java.util.concurrent.CopyOnWriteArrayList;
52
53 import javax.annotation.Nullable;
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 @GwtCompatible(emulated = true)
69 public final class Lists {
70 private Lists() {}
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86 @GwtCompatible(serializable = true)
87 public static <E> ArrayList<E> newArrayList() {
88 return new ArrayList<E>();
89 }
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108 @GwtCompatible(serializable = true)
109 public static <E> ArrayList<E> newArrayList(E... elements) {
110 checkNotNull(elements);
111
112 int capacity = computeArrayListCapacity(elements.length);
113 ArrayList<E> list = new ArrayList<E>(capacity);
114 Collections.addAll(list, elements);
115 return list;
116 }
117
118 @VisibleForTesting static int computeArrayListCapacity(int arraySize) {
119 checkNonnegative(arraySize, "arraySize");
120
121
122 return Ints.saturatedCast(5L + arraySize + (arraySize / 10));
123 }
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140 @GwtCompatible(serializable = true)
141 public static <E> ArrayList<E> newArrayList(Iterable<? extends E> elements) {
142 checkNotNull(elements);
143
144 return (elements instanceof Collection)
145 ? new ArrayList<E>(Collections2.cast(elements))
146 : newArrayList(elements.iterator());
147 }
148
149
150
151
152
153
154
155
156
157 @GwtCompatible(serializable = true)
158 public static <E> ArrayList<E> newArrayList(Iterator<? extends E> elements) {
159 ArrayList<E> list = newArrayList();
160 Iterators.addAll(list, elements);
161 return list;
162 }
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182 @GwtCompatible(serializable = true)
183 public static <E> ArrayList<E> newArrayListWithCapacity(
184 int initialArraySize) {
185 checkNonnegative(initialArraySize, "initialArraySize");
186 return new ArrayList<E>(initialArraySize);
187 }
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205 @GwtCompatible(serializable = true)
206 public static <E> ArrayList<E> newArrayListWithExpectedSize(
207 int estimatedSize) {
208 return new ArrayList<E>(computeArrayListCapacity(estimatedSize));
209 }
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230 @GwtCompatible(serializable = true)
231 public static <E> LinkedList<E> newLinkedList() {
232 return new LinkedList<E>();
233 }
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255 @GwtCompatible(serializable = true)
256 public static <E> LinkedList<E> newLinkedList(
257 Iterable<? extends E> elements) {
258 LinkedList<E> list = newLinkedList();
259 Iterables.addAll(list, elements);
260 return list;
261 }
262
263
264
265
266
267
268
269
270
271
272 @GwtIncompatible("CopyOnWriteArrayList")
273 public static <E> CopyOnWriteArrayList<E> newCopyOnWriteArrayList() {
274 return new CopyOnWriteArrayList<E>();
275 }
276
277
278
279
280
281
282
283
284 @GwtIncompatible("CopyOnWriteArrayList")
285 public static <E> CopyOnWriteArrayList<E> newCopyOnWriteArrayList(
286 Iterable<? extends E> elements) {
287
288
289 Collection<? extends E> elementsCollection = (elements instanceof Collection)
290 ? Collections2.cast(elements)
291 : newArrayList(elements);
292 return new CopyOnWriteArrayList<E>(elementsCollection);
293 }
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311 public static <E> List<E> asList(@Nullable E first, E[] rest) {
312 return new OnePlusArrayList<E>(first, rest);
313 }
314
315
316 private static class OnePlusArrayList<E> extends AbstractList<E>
317 implements Serializable, RandomAccess {
318 final E first;
319 final E[] rest;
320
321 OnePlusArrayList(@Nullable E first, E[] rest) {
322 this.first = first;
323 this.rest = checkNotNull(rest);
324 }
325 @Override public int size() {
326 return rest.length + 1;
327 }
328 @Override public E get(int index) {
329
330 checkElementIndex(index, size());
331 return (index == 0) ? first : rest[index - 1];
332 }
333 private static final long serialVersionUID = 0;
334 }
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353 public static <E> List<E> asList(
354 @Nullable E first, @Nullable E second, E[] rest) {
355 return new TwoPlusArrayList<E>(first, second, rest);
356 }
357
358
359 private static class TwoPlusArrayList<E> extends AbstractList<E>
360 implements Serializable, RandomAccess {
361 final E first;
362 final E second;
363 final E[] rest;
364
365 TwoPlusArrayList(@Nullable E first, @Nullable E second, E[] rest) {
366 this.first = first;
367 this.second = second;
368 this.rest = checkNotNull(rest);
369 }
370 @Override public int size() {
371 return rest.length + 2;
372 }
373 @Override public E get(int index) {
374 switch (index) {
375 case 0:
376 return first;
377 case 1:
378 return second;
379 default:
380
381 checkElementIndex(index, size());
382 return rest[index - 2];
383 }
384 }
385 private static final long serialVersionUID = 0;
386 }
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443 static <B> List<List<B>>
444 cartesianProduct(List<? extends List<? extends B>> lists) {
445 return CartesianList.create(lists);
446 }
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503 static <B> List<List<B>>
504 cartesianProduct(List<? extends B>... lists) {
505 return cartesianProduct(Arrays.asList(lists));
506 }
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541 public static <F, T> List<T> transform(
542 List<F> fromList, Function<? super F, ? extends T> function) {
543 return (fromList instanceof RandomAccess)
544 ? new TransformingRandomAccessList<F, T>(fromList, function)
545 : new TransformingSequentialList<F, T>(fromList, function);
546 }
547
548
549
550
551
552
553 private static class TransformingSequentialList<F, T>
554 extends AbstractSequentialList<T> implements Serializable {
555 final List<F> fromList;
556 final Function<? super F, ? extends T> function;
557
558 TransformingSequentialList(
559 List<F> fromList, Function<? super F, ? extends T> function) {
560 this.fromList = checkNotNull(fromList);
561 this.function = checkNotNull(function);
562 }
563
564
565
566
567
568 @Override public void clear() {
569 fromList.clear();
570 }
571 @Override public int size() {
572 return fromList.size();
573 }
574 @Override public ListIterator<T> listIterator(final int index) {
575 return new TransformedListIterator<F, T>(fromList.listIterator(index)) {
576 @Override
577 T transform(F from) {
578 return function.apply(from);
579 }
580 };
581 }
582
583 private static final long serialVersionUID = 0;
584 }
585
586
587
588
589
590
591
592
593
594 private static class TransformingRandomAccessList<F, T>
595 extends AbstractList<T> implements RandomAccess, Serializable {
596 final List<F> fromList;
597 final Function<? super F, ? extends T> function;
598
599 TransformingRandomAccessList(
600 List<F> fromList, Function<? super F, ? extends T> function) {
601 this.fromList = checkNotNull(fromList);
602 this.function = checkNotNull(function);
603 }
604 @Override public void clear() {
605 fromList.clear();
606 }
607 @Override public T get(int index) {
608 return function.apply(fromList.get(index));
609 }
610 @Override public Iterator<T> iterator() {
611 return listIterator();
612 }
613 @Override public ListIterator<T> listIterator(int index) {
614 return new TransformedListIterator<F, T>(fromList.listIterator(index)) {
615 @Override
616 T transform(F from) {
617 return function.apply(from);
618 }
619 };
620 }
621 @Override public boolean isEmpty() {
622 return fromList.isEmpty();
623 }
624 @Override public T remove(int index) {
625 return function.apply(fromList.remove(index));
626 }
627 @Override public int size() {
628 return fromList.size();
629 }
630 private static final long serialVersionUID = 0;
631 }
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651 public static <T> List<List<T>> partition(List<T> list, int size) {
652 checkNotNull(list);
653 checkArgument(size > 0);
654 return (list instanceof RandomAccess)
655 ? new RandomAccessPartition<T>(list, size)
656 : new Partition<T>(list, size);
657 }
658
659 private static class Partition<T> extends AbstractList<List<T>> {
660 final List<T> list;
661 final int size;
662
663 Partition(List<T> list, int size) {
664 this.list = list;
665 this.size = size;
666 }
667
668 @Override public List<T> get(int index) {
669 checkElementIndex(index, size());
670 int start = index * size;
671 int end = Math.min(start + size, list.size());
672 return list.subList(start, end);
673 }
674
675 @Override public int size() {
676 return IntMath.divide(list.size(), size, RoundingMode.CEILING);
677 }
678
679 @Override public boolean isEmpty() {
680 return list.isEmpty();
681 }
682 }
683
684 private static class RandomAccessPartition<T> extends Partition<T>
685 implements RandomAccess {
686 RandomAccessPartition(List<T> list, int size) {
687 super(list, size);
688 }
689 }
690
691
692
693
694
695
696
697 @Beta public static ImmutableList<Character> charactersOf(String string) {
698 return new StringAsImmutableList(checkNotNull(string));
699 }
700
701 @SuppressWarnings("serial")
702 private static final class StringAsImmutableList
703 extends ImmutableList<Character> {
704
705 private final String string;
706
707 StringAsImmutableList(String string) {
708 this.string = string;
709 }
710
711 @Override public int indexOf(@Nullable Object object) {
712 return (object instanceof Character)
713 ? string.indexOf((Character) object) : -1;
714 }
715
716 @Override public int lastIndexOf(@Nullable Object object) {
717 return (object instanceof Character)
718 ? string.lastIndexOf((Character) object) : -1;
719 }
720
721 @Override public ImmutableList<Character> subList(
722 int fromIndex, int toIndex) {
723 checkPositionIndexes(fromIndex, toIndex, size());
724 return charactersOf(string.substring(fromIndex, toIndex));
725 }
726
727 @Override boolean isPartialView() {
728 return false;
729 }
730
731 @Override public Character get(int index) {
732 checkElementIndex(index, size());
733 return string.charAt(index);
734 }
735
736 @Override public int size() {
737 return string.length();
738 }
739 }
740
741
742
743
744
745
746
747
748
749
750
751
752 @Beta public static List<Character> charactersOf(CharSequence sequence) {
753 return new CharSequenceAsList(checkNotNull(sequence));
754 }
755
756 private static final class CharSequenceAsList
757 extends AbstractList<Character> {
758 private final CharSequence sequence;
759
760 CharSequenceAsList(CharSequence sequence) {
761 this.sequence = sequence;
762 }
763
764 @Override public Character get(int index) {
765 checkElementIndex(index, size());
766 return sequence.charAt(index);
767 }
768
769 @Override public int size() {
770 return sequence.length();
771 }
772 }
773
774
775
776
777
778
779
780
781
782
783
784
785
786 public static <T> List<T> reverse(List<T> list) {
787 if (list instanceof ImmutableList) {
788 return ((ImmutableList<T>) list).reverse();
789 } else if (list instanceof ReverseList) {
790 return ((ReverseList<T>) list).getForwardList();
791 } else if (list instanceof RandomAccess) {
792 return new RandomAccessReverseList<T>(list);
793 } else {
794 return new ReverseList<T>(list);
795 }
796 }
797
798 private static class ReverseList<T> extends AbstractList<T> {
799 private final List<T> forwardList;
800
801 ReverseList(List<T> forwardList) {
802 this.forwardList = checkNotNull(forwardList);
803 }
804
805 List<T> getForwardList() {
806 return forwardList;
807 }
808
809 private int reverseIndex(int index) {
810 int size = size();
811 checkElementIndex(index, size);
812 return (size - 1) - index;
813 }
814
815 private int reversePosition(int index) {
816 int size = size();
817 checkPositionIndex(index, size);
818 return size - index;
819 }
820
821 @Override public void add(int index, @Nullable T element) {
822 forwardList.add(reversePosition(index), element);
823 }
824
825 @Override public void clear() {
826 forwardList.clear();
827 }
828
829 @Override public T remove(int index) {
830 return forwardList.remove(reverseIndex(index));
831 }
832
833 @Override protected void removeRange(int fromIndex, int toIndex) {
834 subList(fromIndex, toIndex).clear();
835 }
836
837 @Override public T set(int index, @Nullable T element) {
838 return forwardList.set(reverseIndex(index), element);
839 }
840
841 @Override public T get(int index) {
842 return forwardList.get(reverseIndex(index));
843 }
844
845 @Override public int size() {
846 return forwardList.size();
847 }
848
849 @Override public List<T> subList(int fromIndex, int toIndex) {
850 checkPositionIndexes(fromIndex, toIndex, size());
851 return reverse(forwardList.subList(
852 reversePosition(toIndex), reversePosition(fromIndex)));
853 }
854
855 @Override public Iterator<T> iterator() {
856 return listIterator();
857 }
858
859 @Override public ListIterator<T> listIterator(int index) {
860 int start = reversePosition(index);
861 final ListIterator<T> forwardIterator = forwardList.listIterator(start);
862 return new ListIterator<T>() {
863
864 boolean canRemoveOrSet;
865
866 @Override public void add(T e) {
867 forwardIterator.add(e);
868 forwardIterator.previous();
869 canRemoveOrSet = false;
870 }
871
872 @Override public boolean hasNext() {
873 return forwardIterator.hasPrevious();
874 }
875
876 @Override public boolean hasPrevious() {
877 return forwardIterator.hasNext();
878 }
879
880 @Override public T next() {
881 if (!hasNext()) {
882 throw new NoSuchElementException();
883 }
884 canRemoveOrSet = true;
885 return forwardIterator.previous();
886 }
887
888 @Override public int nextIndex() {
889 return reversePosition(forwardIterator.nextIndex());
890 }
891
892 @Override public T previous() {
893 if (!hasPrevious()) {
894 throw new NoSuchElementException();
895 }
896 canRemoveOrSet = true;
897 return forwardIterator.next();
898 }
899
900 @Override public int previousIndex() {
901 return nextIndex() - 1;
902 }
903
904 @Override public void remove() {
905 checkRemove(canRemoveOrSet);
906 forwardIterator.remove();
907 canRemoveOrSet = false;
908 }
909
910 @Override public void set(T e) {
911 checkState(canRemoveOrSet);
912 forwardIterator.set(e);
913 }
914 };
915 }
916 }
917
918 private static class RandomAccessReverseList<T> extends ReverseList<T>
919 implements RandomAccess {
920 RandomAccessReverseList(List<T> forwardList) {
921 super(forwardList);
922 }
923 }
924
925
926
927
928 static int hashCodeImpl(List<?> list) {
929
930 int hashCode = 1;
931 for (Object o : list) {
932 hashCode = 31 * hashCode + (o == null ? 0 : o.hashCode());
933
934 hashCode = ~~hashCode;
935
936 }
937 return hashCode;
938 }
939
940
941
942
943 static boolean equalsImpl(List<?> list, @Nullable Object object) {
944 if (object == checkNotNull(list)) {
945 return true;
946 }
947 if (!(object instanceof List)) {
948 return false;
949 }
950
951 List<?> o = (List<?>) object;
952
953 return list.size() == o.size()
954 && Iterators.elementsEqual(list.iterator(), o.iterator());
955 }
956
957
958
959
960 static <E> boolean addAllImpl(
961 List<E> list, int index, Iterable<? extends E> elements) {
962 boolean changed = false;
963 ListIterator<E> listIterator = list.listIterator(index);
964 for (E e : elements) {
965 listIterator.add(e);
966 changed = true;
967 }
968 return changed;
969 }
970
971
972
973
974 static int indexOfImpl(List<?> list, @Nullable Object element) {
975 ListIterator<?> listIterator = list.listIterator();
976 while (listIterator.hasNext()) {
977 if (Objects.equal(element, listIterator.next())) {
978 return listIterator.previousIndex();
979 }
980 }
981 return -1;
982 }
983
984
985
986
987 static int lastIndexOfImpl(List<?> list, @Nullable Object element) {
988 ListIterator<?> listIterator = list.listIterator(list.size());
989 while (listIterator.hasPrevious()) {
990 if (Objects.equal(element, listIterator.previous())) {
991 return listIterator.nextIndex();
992 }
993 }
994 return -1;
995 }
996
997
998
999
1000 static <E> ListIterator<E> listIteratorImpl(List<E> list, int index) {
1001 return new AbstractListWrapper<E>(list).listIterator(index);
1002 }
1003
1004
1005
1006
1007 static <E> List<E> subListImpl(
1008 final List<E> list, int fromIndex, int toIndex) {
1009 List<E> wrapper;
1010 if (list instanceof RandomAccess) {
1011 wrapper = new RandomAccessListWrapper<E>(list) {
1012 @Override public ListIterator<E> listIterator(int index) {
1013 return backingList.listIterator(index);
1014 }
1015
1016 private static final long serialVersionUID = 0;
1017 };
1018 } else {
1019 wrapper = new AbstractListWrapper<E>(list) {
1020 @Override public ListIterator<E> listIterator(int index) {
1021 return backingList.listIterator(index);
1022 }
1023
1024 private static final long serialVersionUID = 0;
1025 };
1026 }
1027 return wrapper.subList(fromIndex, toIndex);
1028 }
1029
1030 private static class AbstractListWrapper<E> extends AbstractList<E> {
1031 final List<E> backingList;
1032
1033 AbstractListWrapper(List<E> backingList) {
1034 this.backingList = checkNotNull(backingList);
1035 }
1036
1037 @Override public void add(int index, E element) {
1038 backingList.add(index, element);
1039 }
1040
1041 @Override public boolean addAll(int index, Collection<? extends E> c) {
1042 return backingList.addAll(index, c);
1043 }
1044
1045 @Override public E get(int index) {
1046 return backingList.get(index);
1047 }
1048
1049 @Override public E remove(int index) {
1050 return backingList.remove(index);
1051 }
1052
1053 @Override public E set(int index, E element) {
1054 return backingList.set(index, element);
1055 }
1056
1057 @Override public boolean contains(Object o) {
1058 return backingList.contains(o);
1059 }
1060
1061 @Override public int size() {
1062 return backingList.size();
1063 }
1064 }
1065
1066 private static class RandomAccessListWrapper<E>
1067 extends AbstractListWrapper<E> implements RandomAccess {
1068 RandomAccessListWrapper(List<E> backingList) {
1069 super(backingList);
1070 }
1071 }
1072
1073
1074
1075
1076 static <T> List<T> cast(Iterable<T> iterable) {
1077 return (List<T>) iterable;
1078 }
1079 }